package Z007InterfaceAndExtends.O03DuoTai;

public class DuoTai { }

class CZFDuoTai{
    public static void main(String[] args) {
        int i = 5 ;
        int j = 6 ;
        int k = i + j ;
        // 如果+号两侧都是整型，那么+代表 数字相加
        System.out.println(k);

        int a = 5 ;
        String b = "5";
        String c = a + b ;
        // 如果+号两侧，任意一个是字符串，那么+代表字符串连接
        System.out.println(c);
    }
} // 操作符的多态演示

/**
 * 要实现类的多态，需要如下条件
 * 1. 父类（接口）引用指向子类对象
 * 2. 调用的方法有重写
 * 那么多态有什么作用呢？ 通过比较不使用多态与使用多态来进一步了解
 */

class WatchClassDuoTai{
    // 观察类的多态现象：
    //1. i1和i2都是Item类型
    //2. 都调用effect方法
    //3. 输出不同的结果
    public static void main(String[] args) {
        Item i1 = new LifePotion();
        Item i2 = new MagicPotion();

        System.out.println("i1 是Item类型，执行effect打印：");
        i1.effect();
        System.out.println("i2 是Item类型，执行effect打印：");
        i2.effect();
    }

    } // 观察多态的展示

class DonUserDuotai {


    public static void main(String[] args) {
        Hero garen = new Hero();
        garen.name = " 盖伦";

        LifePotion lp = new LifePotion();
        MagicPotion mp = new MagicPotion();

        garen.useLifePotion(lp);
        garen.useMagicPotion(mp);

        /**
         * 如果不使用多态，
         * 假设英雄要使用血瓶和魔瓶，就需要为Hero设计两个方法
         * useLifePotion
         * useMagicPotion
         * 除了血瓶和魔瓶还有很多种物品，那么就需要设计很多很多个方法，比如
         * usePurityPotion 净化药水
         * useGuard 守卫
         * useInvisiblePotion 使用隐形药水
         * 等等等等
         */

    }
}    // 没有使用 多态

class UserDuoTai{
    public static void main(String[] args) {
        Hero garen = new Hero();
        garen.name = "盖伦";

        LifePotion lp = new LifePotion();
        MagicPotion mp = new MagicPotion();

        garen.useMagicPotion(mp);
        garen.useLifePotion(lp);
    }
}  // 使用了多态

class Hero{
    public String name ;
    protected float hp ;

    public void useLifePotion(LifePotion lp){
        lp.effect();
    }

    public void useMagicPotion(MagicPotion mp){
        mp.effect();
    }

}

class Item {
     String name;
     int price;

     public void buy() {
         System.out.println("购买");
     }

     public void effect() {
         System.out.println("物品效果");
     }
 }

 class LifePotion extends Item{
    public void effect(){
        System.out.println("血瓶使用后，可以恢复血量");
    }
 }

 class MagicPotion extends Item{
    public void effect(){
        System.out.println("蓝瓶使用后可以恢复魔法");
    }
 }

 // immortal是不朽的，不死的意思
//  mortal就是终有一死的，凡人的意思
//
//
//  1. 设计一个接口
//  接口叫做Mortal,其中有一个方法叫做die
//  2. 实现接口
//  分别让ADHero,APHero,ADAPHero这三个类，实现Mortal接口，不同的类实现die方法的时候，都打印出不一样的字符串
//  3. 为Hero类，添加一个方法,在这个方法中调用 m的die方法。
//  public void kill(Mortal m)
//  4. 在主方法中
//  首先实例化出一个Hero对象:盖伦
//  然后实例化出3个对象，分别是ADHero,APHero,ADAPHero的实例
//  然后让盖伦 kill 这3个